package pg;

import java.awt.Color;

public class Ponto {
  private float x, y, z;
  private Color cor;
  private Vetor normal;
  private double alfa;
  private double beta;
  private double gama;

  public Ponto(float x, float y, float z) {
    this(x, y, z, Color.BLACK);
    this.normal = new Vetor(0, 0, 0);
  }

  public Ponto(float x, float y, float z, Color cor) {
    this.setX(x);
    this.setY(y);
    this.setZ(z);
    this.cor = cor;
    this.normal = new Vetor(0, 0, 0);
  }

  public Ponto() {
    this.x = this.y = this.z = 0;
    this.normal = new Vetor(0, 0, 0);

  }

  public float getX() {
    return this.x;
  }

  public float getY() {
    return this.y;
  }

  public float getZ() {
    return this.z;
  }

  public Color getCor() {
    return this.cor;
  }

  public void setCor(Color cor) {
    this.cor = cor;
  }

  public void setX(float x) {
    this.x = x;
  }

  public void setY(float y) {
    this.y = y;
  }

  public void setZ(float z) {
    this.z = z;
  }

  public void setNormal(Vetor normal) {
    this.normal = normal;
  }

  public void setAlfa(float alfa) {
    this.alfa = alfa;
  }

  public void setBeta(float beta) {
    this.beta = beta;
  }

  public void setGama(float gama) {
    this.gama = gama;
  }

  public float getAlfa() {
    return (float) this.alfa;
  }

  public float getBeta() {
    return (float) this.beta;
  }

  public float getGama() {
    return (float) this.gama;
  }

  private void consertarNormal(Vetor v, Vetor luz) {
    if (Vetor.produtoInterno(v, luz) < 0) {
      v.mult( -1);
    }
  }

  public Vetor getNormal(Triangulo triangulo, Vetor luz) {
    Vetor retorno = Vetor.mult(this.getAlfa(),
                            triangulo.getVertice1().getNormal());
    retorno.soma(Vetor.mult(this.getBeta(),
                               triangulo.getVertice2().getNormal()));
    retorno.soma(Vetor.mult(this.getGama(),
                            triangulo.getVertice3().getNormal()));
    retorno.normalizar();
    this.consertarNormal(retorno, luz);
    return retorno;

  }

  public void adicinarNormal(Vetor normal) {
    this.normal.soma(normal);
  }

  public Vetor getNormal() {
    return this.normal;
  }

  public Ponto copiar() {
    return new Ponto(this.getX(), this.getY(), this.getZ());
  }

  public void soma(Ponto ponto) {
    this.setX(this.getX() + ponto.getX());
    this.setY(this.getY() + ponto.getY());
    this.setZ(this.getZ() + ponto.getZ());
  }

  public static Ponto soma(Ponto ponto1, Ponto ponto2) {
    Ponto r = ponto1.copiar();
    r.soma(ponto2);
    return r;
  }

  public void sub(Ponto ponto) {
    this.setX(this.getX() - ponto.getX());
    this.setY(this.getY() - ponto.getY());
    this.setZ(this.getZ() - ponto.getZ());
  }

  public static Ponto sub(Ponto ponto1, Ponto ponto2) {
    Ponto r = ponto1.copiar();
    r.sub(ponto2);
    return r;
  }

  public void mult(float constante) {
      this.x = (float)this.x * constante;
      this.y = (float)this.y * constante;
      this.z = (float)this.z * constante;
  }

  public static Ponto mult(float constante, Ponto ponto) {
    Ponto r = ponto.copiar();
    r.mult(constante);
    return r;
  }

  public static Ponto soma(Ponto ponto, Vetor vetor) {
    return new Ponto(vetor.getX() + ponto.getX(), vetor.getY() + ponto.getY(),
                     vetor.getZ() + ponto.getZ());
  }

  public static float distancia(Ponto ponto1, Ponto ponto2) {
    Vetor v = new Vetor(ponto1, ponto2);
    return v.getNorma();
  }

  public void substituirMenor(Ponto ponto){
    if(this.getX() > ponto.getX()){
      this.setX(ponto.getX());
    }
    if(this.getY() > ponto.getY()){
      this.setY(ponto.getY());
    }
    if(this.getZ() > ponto.getZ()){
      this.setZ(ponto.getZ());
    }
  }

  public void substituirMaior(Ponto ponto){
    if(this.getX() < ponto.getX()){
      this.setX(ponto.getX());
    }
    if(this.getY() < ponto.getY()){
      this.setY(ponto.getY());
    }
    if(this.getZ() < ponto.getZ()){
      this.setZ(ponto.getZ());
    }
  }

  public String toString() {
    return "(" + x + ", " + y + ", " + z + ")";
  }
}
